/**
 * Project Name:xiaocao-java-basic
 * File Name:RecordFeature.java
 * Package Name:top.wanzc.java.basic.jdk9.to17.feature
 * Date:2024年2月9日下午5:16:41
 * Copyright (c) 2024, zhengchong.wan@minicore.com.hk All Rights Reserved.
 *
*/

package top.wanzc.java.basic.jdk9.to17.feature;
/**
 * @className:RecordFeature 
 * @comment: record是一种全新的类型，它本质上是一个 final类，同时所有的属性都是 final修饰，
 * 它会自动编译出get、hashCode 、比较所有属性值的equals、toString 等方法，减少了代码编写量。
 * 使用 Record 可以更方便的创建一个常量类 
 * 注意事项：
 * Record只会有一个全参构造
 * 重写的equals方法比较所有属性值
 * 可以在Record声明的类中定义静态字段、静态方法或实例方法。
 * 不能在Record声明的类中定义实例字段；
 * 类不能声明为abstract；
 * 不能显式的声明父类，默认父类是java.lang.Record类
 * 因为Record类是一个 final类，所以也没有子类等。
 * @date:     2024年2月9日 下午5:16:41 
 * @author   zhengchong.wan
 * @since    V1.0.0	 
 */
public class RecordFeature {

	public static void main(String[] args) {
		RecordTriangle t = new RecordTriangle(3, 4, 5);
        System.out.println(t);
        System.out.println("面积：" + t.area());
        System.out.println("周长：" + t.perimeter());
        System.out.println("边长：" + t.a() + "," + t.b() + "," + t.c());

        RecordTriangle t2 = new RecordTriangle(3, 4, 5);
        System.out.println(t.equals(t2));
	}

}

record RecordTriangle(double a, double b, double c) {
	public double area() {
		if (a > 0 && b > 0 && c > 0 && a + b > c && b + c > a && a + c > b) {
			double p = (a + b + c) / 2;
			return Math.sqrt(p * (p - a) * (p - b) * (p - c));
		}
		throw new IllegalArgumentException("不是合法的三角形");
	}

	public double perimeter() {
		return a + b + c;
	}
}
